解释器的组成

在HotSpot中,解释器主要由以下几个部分组成:

  • 解释器(interpreter)

    解释执行的功能组件,在HotSpot中,实现了两种解释器,一种是虚拟机默认使用的模板解释器(TemplateInterpreter),另一种是C++解释器(CppInterpreter)

  • 代码生成器(code generator)

    利用解释器的宏汇编器(MASM)向代码缓存空间写入生成的代码

  • InterpreterCodelet

    由解释器运行的代码片段,在HotSpot中,所有由代码生成器生成的代码都由一个Codelet来表示,面向解释器的Codelet称为InterpreterCodelet,由解释器进行维护。

  • 转发表(dispatch table)

    为方便快速找到与字节码对应的机器码,模板解释器使用了转发表,它按照字节码的顺序,包含了所有字节码到机器码的关联信息。模板解释器拥有两张转发表,一张是正常模式表,另一张表用来使解释器进入safepoint,转发表最大256个条目,这是由单字节表示的字节码的最大数量。

解释器如何工作

在系统启动时,解释器按照预定义的规则,为所有字节码分别创建能够在具体计算机平台上运行的机器码(code),并存放在特定位置。当运行时环境需要解释字节码时,就到指定位置取出相应的code,直接在机器上运行。

code模块

  • CodeCache模块

    代码高速缓存。JVM在内存中分配了一块区域,用于代码缓存区,即CodeCache,用来保存那些在运行时生成的可在目标机器上运行的机器码,通过VM选项CodeCacheExpansionSize、InitialCodeCacheSize和ReservedCodeCacheSize可以配置该空间大小。

  • CodeBlob模块

    CodeBlob用作描述Code Cache中所有的缓存项。

字节码表

Bytecodes模块提供了一张字节码表来提供索引服务,其他模块利用bytecode的编号从表中相应位置取得字节码信息。

Code Cache

CodeCache指代码高速缓存,主要用作生成和存储本地代码,这些代码片段包括已经编译好的Java方法和RuntimeStubs。Code Cache空间是由虚拟机托管的一块内存区域,在Jconsole中,也将其与Perm Gem一起合称为非堆内存。